home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-20
/
rs0422.zip
/
LEVEL2
/
AX25.C
next >
Wrap
C/C++ Source or Header
|
1990-11-13
|
3KB
|
142 lines
#include "buffer.h"
#include "iface.h"
#include "timer.h"
#include "ax25.h"
#include "ax25l2.h"
#include "netuser.h"
#include "data.h"
#include "hdlctl.h"
unsigned char ctl_NS, ctl_PF, ctl_NR;
unsigned char digi;
int
get_addr(bpx, adr, mon)
struct datastr *bpx;
register struct ax25_addr *adr;
unsigned char mon; /* True if monitoring, False if real */
{
static int i, j;
static unsigned char numadr, *chd;
static struct datastr *bp;
numadr=digi=0;
bp=bpx;
for (;numadr<7;numadr++, adr++) {
for (i=0;i<ALEN;i++) {
if (((j=bgetch(&bp)) == EOF) || (j & E)) {
j= EOF;
break;
}
adr->call[i]=j;
}
if (j == EOF) break;
chd = bp->rdata; /* Point to next rx ssid */
if ((j=bgetch(&bp)) == EOF) break;
adr->ssid=j;
if(!digi && numadr>1 && !(j & REPEATED)) {
digi=numadr;
if (!mon)
*chd |= REPEATED; /* Incase we repeat it */
}
if (j & E) break;
}
if (j != EOF) return (numadr+1);
free_pkt(bp);
return 0;
}
int
decode_ctl(control)
unsigned char control;
{
static unsigned char ctl, i;
static unsigned char hdlc[10]={I,RR,RNR,REJ,UI,DISC,UA,FRMR,DM,SABM};
ctl = control>>1;
ctl_NS = ctl&7;
ctl = ctl>>3;
ctl_PF = ctl&1;
ctl = ctl>>1;
ctl_NR = ctl&7;
ctl = control;
if ((ctl&1) == 0) return 0; /* I Frame */
else if ((ctl&2) == 0) ctl= (ctl&0x0f); /* Supervisory */
else ctl = (ctl & ~PF); /* Unnumbered */
for (i=1;i<10;i++) if (hdlc[i] == ctl) return i;
return i;
}
#if 0
struct hdlcx hdlc[]={
/* 0 */ {ctl_bit,3},
/* 1 */ {ctl_ns,0},
/* 3 */ {ctl_nr,0},
/* 4 */ {ctl_ret,ctl_I},
/* 5 */ {ctl_bit,7},
/* 6 */ {ctl_nr,0},
/* 7 */ {ctl_bit,3},
/* 8 */ {ctl_bit,1},
/* 9 */ {ctl_ret,ctl_RR},
/* 10 */ {ctl_ret,ctl_REJ},
/* 11 */ {ctl_bit,7},
/* 12 */ {ctl_ret,ctl_RNR},
/* 14 */ {ctl_bit,7},
/* 15 */ {ctl_bit,3},
/* 16 */ {ctl_bit,1},
/* 17 */ {ctl_ret,ctl_UI},
/* 18 */ {ctl_ret,ctl_DISC},
/* 19 */ {ctl_bit,1},
/* 20 */ {ctl_err,0},
/* 21 */ {ctl_ret,ctl_UA},
/* 22 */ {ctl_bit,2},
/* 23 */ {ctl_bit,2},
/* 24 */ {ctl_frmr,ctl_FRMR},
/* 26 */ {ctl_bit,1},
/* 27 */ {ctl_err,0},
/* 28 */ {ctl_bit,3},
/* 29 */ {ctl_bit,1},
/* 30 */ {ctl_ret,ctl_DM},
/* 31 */ {ctl_ret,ctl_SABM},
/* 32 */ {ctl_err,0}
};
int
decode_ctl(control)
unsigned char control;
{
static unsigned char ctl, st;
register struct hdlcx *hd;
ctl = control;
ctl_NR = ctl_NS = ctl_PF = -1;
st=0;
while (st != 255) {
hd = &hdlc[st];
switch (hd->action) {
case 0: if (ctl&1) st += hd->par;
ctl = ctl>>1;
break;
case 1: ctl_NS = ctl&7;
ctl = ctl>>3;
break;
case 2: ctl_NR = ctl&7;
ctl_PF = ctl&8;
ctl = ctl>>4;
break;
case 3: if (ctl != 4) return -1;
/* else return ctl_FRMR; (in .par) */
case 4: return (hd->par);
default: return (-1);
}
st++;
}
return (-1);
}
#endif